package top101K.linkedList;

/**
 * @Author quan
 * @Description 链表中环的入口节点
 * @Date 2023/7/28 22:22
 */
public class Demo7_EntryNodeOfLoop {
    /**
     * 链表中环的入口节点：当快慢指针相遇的时候，引入一个新的节点从链表头结点开始走，
     * 最终新节点一定会和慢指针在环的入口位置相遇
     * @param pHead 链表的头结点
     * @return 环的入口节点
     */
    public ListNode EntryNodeOfLoop(ListNode pHead) {
        //创建快慢指针
        ListNode low = pHead;
        ListNode fast = pHead;
        //找到快慢指针相遇的点
        while (fast!=null && fast.next!=null){
            low = low.next;
            fast = fast.next.next;
            if(low == fast){
                //创建新指针cur
                ListNode cur = pHead;
                while (cur!=low){
                    low = low.next;
                    cur = cur.next;
                }
                return cur;
            }
        }
        return null;
    }
}
